package org.codeblue.support.utils;

import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

import javax.servlet.http.HttpServletRequest;

/**
 * @author liuliwei
 * @version : 1.00
 * @copyright 2011, YIMAFU Co., Ltd. .
 * Create Time : 2011-6-11
 * Description : 常用静态方法类
 */
public class CommonFunction {

	/**
	 * 验证字符串是否为空，为空返回false，否则返回true
	 * @param str 字符串
	 * @return boolean
	 */
	public static boolean isNotNull(String str){
		//return !(str==null||"".equals(str.trim())||str.trim().length()==0);
		return !(str==null||"".equals(str)||str.length()==0);
	}

	/**
	 * 验证一个对象是否为null，为空返回false，否则返回true
	 * @param obj 需要验证的对象
	 * @return boolean
	 */
	public static boolean isNotNull(Object obj){
		return obj!=null;
	}	
	
	/**
	 * 返回trim后的字符串
	 * @param str 需要做trim操作的字符串
	 * @return String
	 */
	public static String Trim(String str){
		return isNotNull(str)?str.trim():"";
	}
	
	// 替换字符串中的非法数据，key为替换目标，value为替换值，搜索页面专用
	private static final Map<String, String> filterStrForSearch = new HashMap<String, String>();
	// 初始化替换数据
	static {
		filterStrForSearch.put("<", "");
		filterStrForSearch.put(">", "");
		filterStrForSearch.put("'", "");
		filterStrForSearch.put("\"", "");
		filterStrForSearch.put("+", "");
		filterStrForSearch.put("_", "");
		filterStrForSearch.put("%", "");
		filterStrForSearch.put("\\r", "");
		filterStrForSearch.put("\\n", "");
		filterStrForSearch.put("\\t", "");
	} 
	 
	/**
	 * 过滤传入对象中的字符串的非法字符
	 * @param value
	 * @return
	 * @auther : liujunmei
	 */
	public static String filterString(String value) {
		// 去除空格
		value = Trim(value);
		// 循环将当前字符串的值进行替换
		for (Map.Entry<String, String> entry : filterStrForSearch.entrySet()) {
			value = value.replace(entry.getKey(), entry.getValue());
		}
		return value;
	}


	/**
	 * @param request
	 * @return      : 
	 * @author      : zhuyu
	 * @version     : 1.00
	 * @create time : 2014-1-27 上午11:29:36
	 * @description : 获取用户真实IP
	*/
	public static String getIpAddr(HttpServletRequest request){
		String ip = request.getHeader(" x-forwarded-for ");
		if(ip == null || ip.length() == 0 || " unknown ".equalsIgnoreCase(ip)){
			ip = request.getHeader( " Proxy-Client-IP " );
		}
		if(ip == null || ip.length() == 0 || " unknown ".equalsIgnoreCase(ip)){
			ip = request.getHeader( " WL-Proxy-Client-IP " );
		}
		if(ip == null || ip.length() == 0 || " unknown ".equalsIgnoreCase(ip)){
			ip = request.getRemoteAddr();
		}
		return ip;
	 }
	


	/**
	 * @return      : 
	 * @author      : zhuyu
	 * @version     : 1.00
	 * @create time : 2014-5-27 下午3:50:50
	 * @description : 随机6位密码
	*/
	
	public static String getRandomNum(){
		Random random = new Random();
		String val = "";    
	    for(int i = 0; i < 6; i++){  
	    	// 输出字母还是数字
	        String charOrNum = random.nextInt(2) % 2 == 0 ? "char" : "num";   
	        // 字符串
	        if("char".equalsIgnoreCase(charOrNum)){     
//	            int choice = random.nextInt(2) % 2 == 0 ? 65 : 97; //取得大写字母还是小写字母     
	            int choice = random.nextInt(2) % 2 == 0 ? 97 : 97; //取得小写字母     
	            val += (char) (choice + random.nextInt(26));     
	        }   
	        // 数字
	        else if("num".equalsIgnoreCase(charOrNum)){     
	            val += String.valueOf(random.nextInt(10));     
	        }     
	    } 
	    return val;
	}
	
	/**
	 * 计算两点距离 A点坐标 double lat_a, double lng_a B点坐标 double lat_b, double lng_b
	 * 
	 * @param lat_a
	 * @param lng_a
	 * @param lat_b
	 * @param lng_b
	 * @return
	 */
	public static double gps2m(double lat_a, double lng_a, double lat_b, double lng_b) {
		double EARTH_RADIUS = 6378137;

		double radLat1 = (lat_a * Math.PI / 180.0);
		double radLat2 = (lat_b * Math.PI / 180.0);
		double a = radLat1 - radLat2;
		double b = (lng_a - lng_b) * Math.PI / 180.0;
		double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2)
				+ Math.cos(radLat1) * Math.cos(radLat2)
				* Math.pow(Math.sin(b / 2), 2)));
		s = s * EARTH_RADIUS;
		s = Math.round(s * 10000) / 10000;
		return s;
	}

	 /**
     * 提供精确的加法运算。
     * @param v1 被加数
     * @param v2 加数
     * @return 两个参数的和
     */
    public static double add(double v1,double v2){
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.add(b2).doubleValue();
    }

    /**
     * 提供精确的减法运算。
     * @param v1 被减数
     * @param v2 减数
     * @return 两个参数的差
     */
    public static double sub(double v1,double v2){
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.subtract(b2).doubleValue();
    }

    /**
     * 提供精确的乘法运算。
     * @param v1 被乘数
     * @param v2 乘数
     * @return 两个参数的积
     */
    public static double mul(double v1,double v2){
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.multiply(b2).doubleValue();
    }


}